09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0



Custom keyboard


Created: 2023-10-23 | Modified: 2024-11-02

Custom split ortholinear 83 key mechanical keyboard with rollerball mouse

Layout

Videos

Parts

Others cool builds

Tools

Guides


Design / concept validation phase

The idea some time ago when i was playing around with ideas for my cyber deck, to design a keyboard. I ended up splitting the keyboard idea out and focusing on that.

I played around with the layout for some time using keyboard-layout-editor.com Finally landing on a layout i liked, with some concepts i wanted to try out.

Colemak keyboard layout

Verifying design concepts

If there's any unknowns in your project, you should try them out early in the process, this can save you a lot of time and hazzle.

Generation + tollerance fit check

3D printed switch plate fit test 3D printed key cap fit test

Connecting the 2 sides

There's multiple ways of connecting the 2 sides of the keyboard namely: I²C (4 wire, typically a 3.5mm audio cable) via seperate micro controller or I/O expander or have a cable with many conductors. Contrary to this video by Zack Freedman (Voidstar Lab) i like rainbow cables.

Connector

Didn't want to wait for a shipment from China, so i made a connector for my rainbow cable, the case design, didn't quite fit the connector, i fixed it in post.

Switch plate

The switch plate was generated using kbplate.ai03.com

Left side initial

Designed and printed the left side of the keyboard. Left side wip

This is the point where i should have chosen to throw out the first prototype, since the connector didn't fit. And it was going to be nightmare to have wires between the two halves. This will come back to haunt me later.

Keycaps

Found this design i liked, but i encoundered a problem with it, it snagged when pressing down. So i modified the design in FreeCAD as an STL , as importing it as openSCAD and then modifying gave me issues. It now has a slope along the long side of the key switch rectangle.

Keycap modification Keycap modification printed

The 2 unit wide keys can be made in PrusaSlicer by cutting it into parts and scaling only the desired part in the desired dimension. The homing indicator, can also simply be made in PrusaSlicer.

When printing, place the keycaps sideways on the build plate, as to use the dimension with the best resulution in FDM printing (Set layer height to the smallest possible). And make sure the top parts of the keycaps are facing away from each other, if printing multiple, to avoid stringing, bumps and other artifacts.

The keycaps still require quite a lot of cleanup, as there's some drop in the stem connector, and some cutting and filing is needed on the side of the stem where the support was.

Wiring

Matrix wiring

This overview was made with VIA

The column wires can be managed by routing them under the diodes from the rows.

Left side testing

I'd recomend staring with wiring a 3x3 matrix and connecting that on a breadboard to your microcontroller, and try building the firmware. To verify the method and avoiding possibly having to resolder big parts.

RP2040 Zero pinout


Build phase

There are now no known unknowns in the project, now comes the grind.

Left side done

Left side connector hotfix Left side wiring final Left side bottom Left side screws

Since i decided to use the first prototype, i had to retrofit the connector outside the housing, meaning i had to design a new piece that a connector i found, could be press fit into.

Left side done right side WIP

Progress both side missing some keycaps

Right side

right side micro controller connector wiring right side micro controller wiring right side wiring top down

When soldering the connector, i soldered wires to the connector first, then i glued in indo place, so the wires could be routed and cut to distance. All 20 trough-hole GPIO pins on the micro controller chip breakout are needed for the 6 rows and 14 columns, but 2 GPIO are needed for I²C for the trackball. So i needed to access the SMD pads on the back of the RP2040, which was some small soldering, i used a flat cable to achive this.

Another problem is that the prototyping PCB the microcontroller is mounted into isn't used for wire management, but meerly to attatch it with screwable mounting holes to the case. This means i have to have lot's of small wires in a tight space this is where Magnet wire comes into play.

Firmware build

Setting Up Your QMK Environment

When creating a handwired keyboard, the convention is to place it in handwired/name

You might have to flip diode_direction in info.json if no keys work. The options are ROW2COL and COL2ROW

Customizing firmware

It's possible to Customize Your Keyboard’s Behavior by writing a bit of C code.

I've coded the following:

The way i figured out how to do something specific, was a combination of reading the documentation, and greping through how other keyboards in the keyboards directory does things.

TODO Host, post and add link to GIT repo

Next challenge learning colemak

It's a steep learning curve, but the finger movement, or lack there of for typing English seems more sound. Set aside a weekend for learning where the keys are, and be prepared to be frustrated at typing at 5 wpm, and slowly working up from there. It's a bit unfortunate that I'm changing multiple variables at the same time, Namely learning touch typing, at the same time as i switch to colemak and an ortholinear layout. Therefore i will not know which impact each has on percieved finger health and typing speed.

Also small rant about the legacy typewriter layout that sadly is the norm now adays. How are you supposed to twist and contort your middle finger to reach from D on the home row to C below when your hands are so close together that they aren't straight. It feels more natural for my pointing finger to reach the C button, because it aligns with the direction my hands are pointing.

Retrospective / Ideas for a version 2

Work methodologies

Before starting a handwired keyboard project know that:

Scrolling / volume rollers

Scrolling and adjusting volume with the trackball works great. It would be awesome to explore this concept more, by having a dedicated rotary encoder for it, perhaps two, for quick onehanded volume adjustment, without holding the modifier (FN), which is on the other side of the keyboard.

Device specific LED indicators

The LED in the pimoroni trackball works great to indicate which mode it's in. So having dedicated LEDs for each device, to indicate which mode it's in is a great to have.

LED indicators

They work great as a layer indicator. Another idea is to add a photo resistor to dimm them in low ambient.

Pimoroni trackball

It's a really nifty little device, glad i tried it out, but it's not precise enough for my taste. It might be the QMK implementation (which already existed, which is nice), It might be a hardware thing. Not sure, haven't read raw device output, i assume default QMK settings are sane. But next time around i want to try a different pointing device, perhaps a ThinkPad trackpoint.

Connector / cable / wiring management

It worked fine for the time, since i had plenty of time to work on it now, and didn't have to wait for components. The process of hand wiring is labor intensive and tedious work. Managing the wiring in a PCB and using chips in each half, with standard cables would be preferable. Then it's also possible to use longer cables to position the keyboard on either side of a laptop, when using it on the go. Taking up less space in one dimmension, but more in another, by not having to move the laptop as far back, giving you flexibility.

Touch typing colorway

The keycaps can be colored to indicate which finger should be used. This could also be done in software, if one chooses to add per key LEDs.

Standoffs on switch plate

Designing the standoffs into the switch plate might be desirable, since it can make the cable wiring a bit easier,

Macro recording indicator

QMK Has the ability to record Dynamic macros It would be cool to indicate the recording of such, by blinking the main indicator LED red, this requires the ability to get milis() or similar.

Sub par typing experience, due to keycap profile and switch type

I'm not satisfied with the typing experience, the keycaps leave very little space between the keys, which amounts to not easily being able to easily find the center of the key quickly, and with little cognitive overhead. Thus resulting in miss clicks, this matched with the assortment of bad key switches leads a subpar and frustrating typing experience. This is fine tho, because the first iteration serves as the biggest learning test bed, to see what works. I'd argue for intentionally making a prototype without all the nice finishing work, and using it for a while, to see which concepts work


Comments













(Will await approval before becoming public)